package entity.thread;

import java.util.concurrent.Semaphore;

public class SemaphoreExample {

    public static void main(String[] args) {
        // 1. 创建一个信号量，初始许可数为3（最多允许3个线程同时运行）
        final Semaphore semaphore = new Semaphore(3);

        // 2. 创建10个任务，模拟需要处理的工作
        for (int i = 1; i <= 10; i++) {
            Thread worker = new Thread(new Worker(semaphore, i));
            worker.start();
        }
    }

    static class Worker implements Runnable {
        private final Semaphore semaphore;
        private final int id;

        public Worker(Semaphore semaphore, int id) {
            this.semaphore = semaphore;
            this.id = id;
        }

        @Override
        public void run() {
            try {
                // 请求获取许可（如果没有许可可用，线程会在此阻塞等待）
                semaphore.acquire();
                System.out.println("工人 " + id + " 拿到许可证，开始工作...");

                // 模拟工作任务耗时
                Thread.sleep(2000);

                System.out.println("工人 " + id + " 工作完成，释放许可证。");

            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 非常重要！无论任务是否成功完成，必须在finally块中释放许可
                semaphore.release();
            }
        }
    }
}